合併兩個有序鍊錶

2021-09-27 11:20:16 字數 1441 閱讀 7735

給定兩個有序單鏈表的頭節點head1和head2,請合併兩個有序鍊錶,合併後的鍊錶依然有序,並返回合併後的頭節點

例如:

0->2->3->7->null

1->3->5->7->9->null

合併後的鍊錶為:

0->1->3->3->5->7->7->9->null

如果兩個鍊錶中乙個為空,直接返回另乙個鍊錶的頭節點即可

然後比較head1和head2的值,小的節點也是合併後鍊錶的最小節點,這個節點就是合併後鍊錶的頭節點,記為head。在之後的步驟裡,哪個鍊錶的頭節點的值更小,另乙個鍊錶的所有節點都會插入到這個鍊錶中。

這裡我們假設head節點所在的鍊錶1,另乙個鍊錶為鍊錶2.鍊錶1和鍊錶2都從頭節點開始一起遍歷,比較每次遍歷到的兩個節點的值,記為cur1和cur2,然後根據大小關係做出不同的調整,同時使用乙個變數pre表上上次比較時較小的節點。

假如:鍊錶1為1->5->6->null,鍊錶2為2->3->7->null

此時cur1=1,cur2=2,pre=1。cur1小於cur2,不做調整,因為此時cur1較小,所以令pre=cur1=1,然後繼續遍歷鍊錶1的下乙個節點,也就是節點5.

cur1=5,cur2=2,pre=1。cur1大於cur2,讓pre的next指標指向cur2,cur2的next指標指向cur1,這樣,cur2便插入到鍊錶1中。因為此時cur2較小,所以令pre=cur2=2,然後繼續遍歷鍊錶2的下乙個節點,也就是3.這一步完成後,鍊錶1變為1->2->5->6->null,鍊錶2為3->7->null。cur1=5,cur2=3,pre=2。

後面依此類推…

如果鍊錶1先走完,此時cur1=null,pre為鍊錶的最後乙個節點,那麼就把pre的next指標指向鍊錶2當前的節點(即cur2),表示把鍊錶2沒遍歷到的有序部分直接拼接到最後,調整結束。如果鍊錶2先走完,說明鍊錶2的所有節點都已經插入到鍊錶1中,調整結束。

返回合併後的頭節點head

public listnode mergetwolists

(listnode head1,listnode head2)

listnode head = head1.value <= head2.value ? head1 : head2;

listnode cur1 = head == head1 ? head1 : head2;

listnode cur2 = head == head1 ? head2 : head1;

listnode pre = null;

listnode next = null;

while

(cur1 != null && cur2 != null)

else

} pre.next = cur1 == null ? cur2 : cur1;

reutrn head;

}

合併兩個有序鍊錶

鍊錶的題目總是讓我很惆悵。動輒就會runtime error。比如這題,額外用了乙個節點的空間來儲存頭節點。我很不情願多用這個空間,不過貌似不行。貌似不行,實際可行,見附錄。把頭節點提出迴圈 實現類 class solution else if l1 null p next l1 if l2 nul...

合併兩個有序鍊錶

三個指標乙個儲存la鍊錶 乙個儲存lb鍊錶,乙個指向新的鍊錶。鍊錶的插入,兩個指標,乙個是head,乙個指向head後面的鏈,新插入的元素位於head後面。執行該 自己外加上class類。static class node public static void main string args st...

合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4思路 很簡單就是二路歸併的思想,時間複雜度o n definition for singly linked list.struct listno...