方法一:這是我一開始的想法,將鍊錶l2的各個元素與鍊錶l1的元素進行逐一比較,將l2中的資料元素插入l1中的合適位置。
時間複雜度:o(m+n);空間複雜度:o(1)
1)首先,可能要對第乙個元素進行插入操作,所以為了統一插入操作,需要建立哨兵;
2)迴圈終止條件是l2遍歷完即nullptr == pworknodel2,但是在迴圈過程中,l1可能先遍歷完,所以要對l1分情況討論;
3)跳出迴圈後,要對檢測l1是否遍歷完。
這是自然而然的想法,但是經驗告訴我們類似這種直覺的想法往往可能不是最好的。
方法二:可以將鍊錶合併的過程看做是新鍊錶的建立過程。比較兩個鍊錶資料元素的大小,將資料元素值小的結點插入新鍊錶的末尾,直到遍歷完其中乙個鍊錶,再將另乙個鍊錶中的剩餘結點拼接到新鍊錶的末尾。
時間複雜度:o(m+n);空間複雜度:o(1)
雖然這個演算法的在時間複雜度上並沒有什麼提公升,但是會感覺這個思路很清晰,給人一種豁然開朗的感覺。實現上要注意的和第一種方法差不多,不同的迴圈終止條件和迴圈結束後的判斷。
/** * definition for singly-linked list.
* struct listnode
* }; */
class
solution
else
pinsertnode->next =nullptr;
ptialnode->next =pinsertnode;
ptialnode =pinsertnode;
}ptialnode->next = !l1 ?l2 : l1;
return phead->next;
}};
LeetCode 21合併兩個有序列表
將兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4初始解法 這個問題轉換為經典的merge排序中的merge過程.merge排序中merge操作即是將兩個有序子陣列合併成乙個陣列,需要考慮比較過程...
leetcode21 合併兩個有序鍊錶
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 思路 每次判斷兩個鍊錶的頭部小的數值,訪問小的,並讓該鍊錶往後移動。注意 注意鍊錶走完,為空的情況即可。遇到的問題 一開始不太理解鍊錶,返回e...
LEETCODE 21 合併兩個有序鍊錶
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4c 第一遍將 相等 的這個else分支寫錯了,主要錯誤在於,next指標指向下乙個的這條語句寫到了後面,導致節點自己指向自己,造成了超時錯誤 執...