C#代码随想录算法训练营第四天 | LeetCode24 LeetCode19 面试题 02.07. 链表相交

24 两两交换链表中的节点

题目链接:力扣题目链接

主要思想:使用一个虚拟头结点,头结点指向head。循环判断下一个和下下一个是否为空,因为如果不为空要进行交换。记录temp 1 2,是为了交换,记录 temp3是为了让1后指向3。

 public static ListNode SwapPairs(ListNode head)
 {
     var dummyNode = new ListNode(0);
     dummyNode.next = head;
     var curNode= dummyNode;
     while (curNode.next!=null&&curNode.next.next!=null)
     {
         var temp1 = curNode.next;
         var temp2 = curNode.next.next;
         var temp3=curNode.next.next.next;
         curNode.next= temp2;
         curNode.next.next = temp1;
         curNode.next.next.next = temp3;
         curNode = curNode.next.next;

     }
     return dummyNode.next;
 }

19.删除链表的倒数第N个节点

 题目链接:. - 力扣(LeetCode)

 主要思想:双指针,fast指针要距离slow指针n个距离。

 官方示例 :输入head = [1,2,3,4,5],在循环内 三个值为

n(val)210-1-2
fast(val)01234
slow(val)00012

最后值为 -2 5 3,将slow的next值指向next.next值删除

public static ListNode RemoveNthFromEnd(ListNode head, int n)
{
    var dummyNode= new ListNode(0);
    dummyNode.next= head;
    var slowNode = dummyNode;
    var fastNode = dummyNode;
    while (fastNode.next != null)
    {
        Console.Write($"n:{n} fast:{fastNode.val} slow{slowNode.val}\n");
        if (n<=0)
        {
            slowNode=slowNode.next;
        }
        fastNode = fastNode.next;
        n--;
    }

    slowNode.next = slowNode.next.next;
    return dummyNode.next;
}

链表相交

  题目链接:. - 力扣(LeetCode)

主要思想:先算出两个链表的长度差值,长的后移动差值位,然后比较

  public ListNode GetIntersectionNode(ListNode headA, ListNode headB) 
  {
        if(headA==null||headB==null) return null;
        var dummyNodeA = headA;
        var dummyNodeB = headB;
        int lenA = 0;
        int LenB = 0;
        while (dummyNodeA.next!=null)
        {
            dummyNodeA = dummyNodeA.next;
            lenA++;
        }
        while (dummyNodeB.next != null)
        {
            dummyNodeB = dummyNodeB.next;
            LenB++;
        }

        dummyNodeA = lenA > LenB ? headA : headB;
        dummyNodeB = lenA <= LenB ? headA : headB;
        int gap = Math.Abs(lenA - LenB);
        while (gap>0)
        {
            dummyNodeA=dummyNodeA.next;
            gap--;
        }

        while (dummyNodeA!=null)
        {
            if (dummyNodeA==dummyNodeB)
            {
                return dummyNodeA;
            }

            dummyNodeA = dummyNodeA.next;
            dummyNodeB=dummyNodeB.next;
        }
        return null;
    }  

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值