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

2020-10-15  本文已影响0人  小mg

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);

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;


解法二:递归

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)

思路

和解法一的大体思路一样


单向链表的总结

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

链表知识点链接 链表

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

上一篇下一篇

猜你喜欢

热点阅读