2020/10/15合并两个有序链表

leetCode题目-合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

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

代码样式

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        
    }
}

我的代码,思路极其繁琐,同时还没有完全实现功能

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null) return l2;
        if(l2==null) return l1;
        List<Integer> list=new ArrayList<Integer>();
            do{
                list.add(l1.val);
                l1=l1.next;
                if (l1.next==null) list.add(l1.val);
            }while(l1.next!=null);
            do{
                list.add(l2.val);
                l2=l2.next;
                if (l2.next==null) list.add(l2.val);
            }while(l2.next!=null);
            Collections.sort(list);
            System.out.println(list);
            ListNode head= new ListNode(0);
            ListNode currt=head;
            for(int i=0;i<list.size();i++){
             currt.next=new ListNode(list.get(i));
             currt=currt.next;
            }
            return head.next;
    }

思路

l1=l1.next;
if (l1.next==null) list.add(l1.val);

  • 首先是将两个单向链表的值全部取出放到一个list集合中,但此时就出现了问题,就是在上面这句中,首先对链表l1进行了指向下一个节点的操作,然后在之后的if判断语句中再进行l1.next的判断,就相当于对最初的 l1进行 l1.next.next的判断,极其容易报NullPointException;
  • 然后就是使用list集合的排序方法 Collections.sort(list); 对集合进行排序
  • 最后再将排序好的集合遍历放到一个链表中

ListNode head= new ListNode(0);
ListNode currt=head;

这里有个需要注意的问题,就是下面两行代码,不能直接写成ListNode currt= new ListNode(0);因为后面是对currt进行操作,在算法结束之后,不再指向头节点,所以一开始需要一个虚拟头节点保留对链表头节点的引用(在下面的简单实现中也是)


解法一:java简单实现

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 类似归并排序中的合并过程
        ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                cur = cur.next;
                l1 = l1.next;
            } else {
                cur.next = l2;
                cur = cur.next;
                l2 = l2.next;
            }
        }
        // 任一为空,直接连接另一条链表
        if (l1 == null) {
            cur.next = l2;
        } else {
            cur.next = l1;
        }
        return dummyHead.next;
    }

思路

ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;

  • 首先这里和上面一样,都是得创建一个虚拟节点指向头引用
  • 其次这里的cur.next指向的是 l1.val和 l2.val比较后较小的那个链表,被cur.next指向的较小的链表需要再指向自己的下一个节点.next,cur也指向自己的下一个几点存放之后两个链表比较,值小的那一个链表。
  • 然后只要 l1 != null && l2 != null就一直对后面的 l1.val和l2.val值进行比较
  • 当 l1 l2中只要有一个出现null了之后就会跳出循环,直接将不为null的那个链表加到cur链表的尾部
  • 最后输出要注意,因为dummyHead指向的是虚拟头节点,不是直接指向要输出的链表的头节点,指向的是要输出的链表的头节点的前一个节点。

解法二:递归

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }

    }
}

来源:力扣(LeetCode)

思路

和解法一的大体思路一样

  • 对于 l1和 l2是否为null的判断是在开始和进行中都会执行的
  • 递归的方法不是在新的链表后面进行改变,就是在原有的 l1 l2链表的基础上取最小的进行叠加,结束的条件是 l1或 l2有一个出现了null

单向链表的总结

链表结构图
  • 单向链表和数组的对比,链表对于元素的查找不像数组一样可以通过下标快速定位,需要从头开始一个一个的遍历,直到取到元素,但是链表相对于数组的优点是,数组需要一块连续的内存空间,而链表不需要。
  • 链表的结构是由数据和下一个节点的地址所组成的
  • 对于链表的增删改查都需要结合节点中的地址来实现,改变节点地址的指向,来改变链表的结构

链表知识点链接 链表

2020年10月15日,看了一天就看了这一道题目,随时都能走神,真是服了我自己,不可能一天就只做一道算法题,其他什么也不学了。刚买的鞋穿了一天就开胶,真是点背。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339