剑指offer(牛客)——合并两个排序的链表

简介: 剑指offer(牛客)——合并两个排序的链表

OJ链接:合并两个排序的链表

C语言实现

思路:由于两个链表是排好序了的,那么我们对于这种题的解法可以先创建出一个新的头结点,然后再创建一个指针cur指向这个头结点,然后两个链表的值之间进行比较,利用cur去改变链表的next域,将两个链表串起来,最后肯定会有一方头结点走空,那么我们可以,之后将cur所在节点的next域指向未走空的节点头结点,这样我们就把所有的数据串起来了


具体代码实现:

struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    // write code here
    //生成一个节点,利用这个节点去把这两个链表进行串起来
    struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* cur = newhead;
    //循环终止条件,如果其中一个头结点为空,那么就跳出循环
    while(pHead1!=NULL&&pHead2!=NULL)
    {
        //如果更小的是pHead1所在节点,就要串到pHead1,然后pHead1往后走
        if(pHead1->val<pHead2->val)
        {
            cur->next=pHead1;
            cur=cur->next;
            pHead1=pHead1->next;
        }
        else
        {
            cur->next=pHead2;
            cur=cur->next;
            pHead2=pHead2->next;
        }
    }
    //如果pHead1走空,就把剩下的数据串与pHead2连上
    if(pHead1==NULL)
    {
        cur->next=pHead2;
    }
    else
    {
        cur->next=pHead1;
    }
    //返回生成节点的next即可
    return newhead->next;
}

JAVA版本

思路:同C语言实现思想一致

具体代码如下:

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        ListNode newNode = new ListNode(-1);
        ListNode cur = newNode;
        while(list1!=null&&list2!=null){
            if(list1.val<list2.val){
                cur.next=list1;
                list1=list1.next;
                cur=cur.next;
            }else{
                cur.next=list2;
                list2=list2.next;
                cur=cur.next;
            }
        }
        if(list1==null){
            cur.next=list2;
        }else{
            cur.next=list1;
        }
        return newNode.next;
    }
}


总结:

对于本题我们主要要学习一个傀儡节点的使用,利用傀儡节点可以有效的帮助我们解决这种排序两个链表的问题,主要的其实还是要理解思想,如何去做,代码实现起来还是挺快的,对于链表的习题我会持续的进行更新!如有写的不好的地方,请及时指出,相互学习!!!

目录
相关文章
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0
|
2月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
34 0
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
58 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
46 4
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
48 0
|
6月前
23.合并K个升序链表
23.合并K个升序链表
|
6月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
6月前
|
存储 SQL 算法
LeetCode 题目 82:删除排序链表中的重复元素 II
LeetCode 题目 82:删除排序链表中的重复元素 II
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表