LeedCode种有关链表List题目总结一

LeedCode种有关链表List题目总结一

1.Reverse Linked List(将链表逆置)
思路:采用头插法,从第二个节点开始一个一个往最前面移动。

2.Merge Two sorted lists(合并两个排序列表)
思路:对两个链表中的元素进行比较,然后移动即可。先建一个节点作为新链表的头结点,然后比较两个链表中的元素大小,一个一个连接起来,最后返回头结点的next;主要代码如下:
if(l1 == null) return l2;
if(l2 == null) return l1;

    ListNode newList = new ListNode(0);
    ListNode newhead;

    newhead = newList;

    while(l1 != null && l2!= null){

        if(l1.val<l2.val){
            newList.next = l1;
            l1 = l1.next;
        }
        else
        {
            newList.next = l2;
            l2 = l2.next;
        }
        newList = newList.next;
    }

    if(l1 == null) newList.next = l2;
    if(l2 == null) newList.next = l1;

    newList = newhead;
    newhead = newhead.next;

    return newhead;

3.Merge K sorted Lists(将多个已经排序的链表合并)
思路:这道题是上道题的延伸,如果继续用上面合并两个链表的方法来进行两辆合并,那么时间复杂度太高,这道题显然不适合用这种思路。我们想到用最小堆的方法。将每个链表的头元素取出来建立一个小堆,再该堆中取出最小值,将其合并到新的链表中,再将这个元素的指针指向下一个元素加入到堆中,做调整,依次类推,直到堆空。

4.Linked List Cycle(判断一个链表是否有环)
思路:设置一个快指针,一个慢指针,快指针每次走两步,慢指针每次走一步,若果两个指针能相遇,则证明有环存在。若无环,则指针的next或者next.next会为空,返回false。

5.Linked List Cycle II(找出链表环开始的节点,如果没环,返回Null)
思路:首先还是先设两个指针,一个快指针,一个满指针,然后找到两个指针的相遇点。此时满指针走了s,快指针走了2s,那么此时链表的起始节点到该相遇点的距离与相遇点走一圈到相遇点的距离是一样的,都是s,此时,再设两个指针,一个从链表头开始走,另一个从相遇点开始走,都每次走一步,此时两个指针的第一个相遇点即为链表环的入口点。

6.Remove Nth Node From End of List(删除链表的从后数的第N个节点)
思路:要想删除一个节点,必须知道他的前驱节点和后继节点,但该题目是从后开始数,不知道前面有多少个,在只遍历一遍的情况下,很难知道它的前驱节点是哪个。于是我们得换种思路,借鉴找链表是否有环的判断方法,依然用两个指针,快指针和慢指针。让快指针先走N步,然后快慢指针一起走,当快指针的Next为空时,此时慢指针所指节点就是所要删除的节点。在这里为了方便,我们加一个头结点,则此时的节点为要删除节点的前驱节点,直接删除即可。这个思路非常巧妙,熟记于心。

7.Palindrome Linked List(判断一个链表是不是回文)
思路:回文是关于中心对称的,链表有一个限制就是只能从前往后找不能从后往前访问元素。那么就得想办法找到中心节点,然后比较这两部分对称不对称了。要想判断链表对称,得将某一部分逆置,这样就可以依次比较元素了。首先根据快指针和慢指针的思路,找到中心节点,然后将前半部分链表或者后半部分链表逆置,这里我们逆置后半部分链表比较方便。之后一个指针从头结点开始,另一个指针从中心节点开始,依次比较是否相等。这道题结合了链表的几个重要的技巧,多温故。

8.Intersection of two Linked List(求两个链表的第一个公共节点)
思路1:首先求出两个链表的各自长度,L1和L2,如果L1>L2,则链表一的指针先走L1-l2步,否则链表二的指针先走L2-L1步,然后两个指针同时走,直到两个节点相等为止。

思路2:对于链表一而言,先遍历完链表一,紧接着遍历链表二。对于链表二而言,先遍历完链表二,接着遍历链表一,此时两个的长度是一样的,那么再次判断是否有相等的节点,若有返回第一个,无,返回空。具体代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值