1. 程式人生 > >LeetCode 21. 合併兩個有序連結串列 Merge Two Sorted Lists(C語言)

LeetCode 21. 合併兩個有序連結串列 Merge Two Sorted Lists(C語言)

題目描述:

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

題目解答:

方法1:直接遍歷

申請頭結點,方便在後邊插入節點。
執行時間4ms,程式碼如下。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* t = head; while(l1 && l2) { if(l1->val > l2->val) { t->next = l2; l2 =
l2->next; } else { t->next = l1; l1 = l1->next; } t = t->next; } t->next = (l1 ? l1 : l2); t = head->next; free(head); return t; }

方法2:遞迴法

但遞迴會用棧空間,如果元素太多,會溢位。
執行時間還4ms,程式碼如下。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { if(l1 == NULL) return l2; if(l2 == NULL) return l1; if(l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l2->next, l1); return l2; } }