leetcode刷刷題(30) ---- 合併兩個有序鏈表(C語言版)

2020-2-12

  • You gotta do what you’re meant to do.
    想做什麼就去做。

題目

將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 

示例:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

個人解答:(C版本)

  • 主體思路:通過比較兩個鏈表值的大小,切換指針的指向,不斷迭代完成。
  • 具體思路看代碼註釋。不過最好還是自己畫圖理解或者查看官方題解的動圖
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){

    struct ListNode*  q = NULL;
    struct ListNode*  p = NULL;
    struct ListNode*  t = NULL;

	// 檢查是否有空鏈表
    if(NULL == l1)
    {
        return l2;
    }
    if(NULL == l2)
    {
        return l1;
    }

	// 把值最小的鏈表命名爲l1,方便操作
    if(l1->val > l2->val)
    {
        t = l1;
        l1 = l2;
        l2 = t;
    }

    q = l1; // 指向l1
    p = l2;	// 指向l2
    while(NULL != q->next)
    {
    	//將p指向的值按大小插入q所在的鏈表
        if((p->val >= q->val) && (p->val < q->next->val))
        {
            t = q->next; // t作爲中轉值
            q->next = p;
            q = t;

            t = p->next; // t作爲中轉值
            p->next = q;
            q = p;
            p = t;
        }
        else
        {
            q = q->next;
        }

        if(NULL == p) 
        {
            return l1;
        }
    }

    q->next = p;
    
    return l1;
}
  • 結果:
    在這裏插入圖片描述
他山之石:
  • 參考了[官方題解]https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode/),官方依舊提供了迭代和遞歸的方式,其中遞歸的方法真的很精妙,不過理解起來也很複雜。
發佈了251 篇原創文章 · 獲贊 168 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章