链表类题目:判断链表是否有环

题目描述

判断链表是否有环

题目解析:

  1. 使用set,遍历时如果不在set中,则加入set,如果已经在set中,说明之前已经出现过,那么返回true.
  2. 使用快慢指针:slow每次走一步,fast每次都2步,如果有环一定会相遇,即fast == slow
bool hasCycle(ListNode*head)
{
    if(head == nullptr || head->next==nullptr)  return false;

    ListNode * slow = head;
    ListNode * fast = head->next;

    while (fast !=nullptr && fast->next != nullptr)
    {
        if(fast == slow)
        {
            return true;
        }
        fast = fast->next->next;
        slow = slow->next;
    }
    return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下Python代码来实现:class ListNode: def __init__(self, val): self.val = val self.next = None def mergeTwoLists(l1, l2): if l1 is None: return l2 if l2 is None: return l1 if l1.val < l2.val: l1.next = mergeTwoLists(l1.next, l2) return l1 else: l2.next = mergeTwoLists(l1, l2.next) return l2 ### 回答2: 可以通过递归的方式来实现将两个升序链表合并为一个新的升序链表的功能。 首先,我们需要判断是否存在空链表,若其中一个链表为空,则直接返回另一个链表;若都为空,则返回空链表。 然后,我们比较两个链表当前节点的值,将较小的节点作为新链表的当前节点,并将指针后移。对于较小的节点所在的链表,我们将其next指向递归地合并另一条链表的剩余部分。 最后,返回新链表的头节点。 以下是实现的Python代码: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def mergeTwoLists(l1, l2): if not l1: return l2 if not l2: return l1 if l1.val < l2.val: l1.next = mergeTwoLists(l1.next, l2) return l1 else: l2.next = mergeTwoLists(l1, l2.next) return l2 # 测试示例 # 创建链表1:1->2->4 l1 = ListNode(1) l1.next = ListNode(2) l1.next.next = ListNode(4) # 创建链表2:1->3->4 l2 = ListNode(1) l2.next = ListNode(3) l2.next.next = ListNode(4) # 合并链表 merged_list = mergeTwoLists(l1, l2) # 遍历输出合并后的链表节点的值 while merged_list: print(merged_list.val, end=' ') merged_list = merged_list.next # 输出结果为:1 1 2 3 4 4 ``` 此时,我们可以得到一个新的升序链表,其节点的值为1 1 2 3 4 4。 ### 回答3: 要实现将两个升序链表合并为一个新的升序链表并返回,我们可以使用Python来完成这个任务。首先我们需要定义一个链表节点的类,包括节点的值和指向下一个节点的指针。 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next ``` 接下来,我们可以定义一个函数来合并两个升序链表。我们可以创建一个新的链表,遍历两个原始链表,比较节点的值,然后将较小的节点添加到新链表中,直至遍历完其中一个链表。 ```python def mergeTwoLists(l1, l2): dummy = ListNode(0) # 创建一个虚拟头节点 current = dummy # 当前节点指向虚拟头节点 while l1 and l2: # 当两个链表都不为空时进行比较 if l1.val < l2.val: current.next = l1 # 将较小的节点添加到新链表中 l1 = l1.next # 链表1指针后移 else: current.next = l2 l2 = l2.next # 链表2指针后移 current = current.next # 新链表指针后移 if l1: # 如果链表1还有剩余节点 current.next = l1 # 将剩余节点添加到新链表中 if l2: # 如果链表2还有剩余节点 current.next = l2 # 将剩余节点添加到新链表中 return dummy.next # 返回新链表的头节点 ``` 这样,我们就可以将两个升序链表合并为一个新的升序链表并返回。可以通过创建链表节点对象来测试该函数。 ```python # 创建链表1:1 -> 2 -> 4 l1 = ListNode(1) l1.next = ListNode(2) l1.next.next = ListNode(4) # 创建链表2:1 -> 3 -> 4 l2 = ListNode(1) l2.next = ListNode(3) l2.next.next = ListNode(4) # 合并链表1和链表2 mergedList = mergeTwoLists(l1, l2) # 输出合并后的链表:1 -> 1 -> 2 -> 3 -> 4 -> 4 while mergedList: print(mergedList.val) mergedList = mergedList.next ``` 以上代码实现了将两个升序链表合并为一个新的升序链表并返回的功能,通过输出可以验证程序的正确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值