這是合并兩個有序鏈表的遞回代碼。迭代會寫,遞回寫不對。
這是LeetCode的官方的解答。問題:
后面兩個else if為什么要把return寫在里面,還有l1.next = mergeTwoLists(l1.next, l2);中為什么是l1.next?
它if中不是l1.val嗎?這個代碼是怎么處理一個鏈表比較完了,另一個鏈表還沒有比較完呢?
請指教

class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
uj5u.com熱心網友回復:
這有什么難理解的如果l1當前節點小于l2當前節點(l1.val<l2.val),就保留l1點前節點,然后用l1的下一個節點開始的集合和l2做合并,合并好的結果保存到l1的下一個節點(l1.next=mergeTowLists),這樣即能保證小的節點排在前面(保留l1當前小的節點),又能保證節點能串接在一起成為個大集合(l1的下一個節點指向排序合并好的集合)
反之,l2.val<l1.val也一樣,先保留l2當前節點,然后用l2的下一個節點開始的集合和l1合并,合并結果保存到l2的下一個節點。
uj5u.com熱心網友回復:
你沒理解程式的作用,
l1.val < l2.val是比較當前2個鏈表的當前節點值的大小,如果l1小則不變,比較節點移動到l1.next與l2的當前節點比較,如果l2小則把l2整段鏈接l1.next后面,再比較l2.next和l1當前節點的大小。.
uj5u.com熱心網友回復:
鏈表的作用就是后一個節點存了前一個節點的地址資訊,用前一個節點的next指向后一個節點,就能合并鏈表轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141962.html
標籤:Java SE
