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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章